Omanda andmete ümberkujundamine Python Pandase pivot-tabelitega. Süvitsi süntaksisse, edasijõudnud tehnikatesse ja praktilistesse näidetesse globaalseks andmeanalüüsiks.
Python Pandase Pivot-tabelid: Põhjalik juhend andmete ümberkujundamiseks
Andmeanalüüsi maailmas ei ole andmete summeerimise, agregeerimise ja restruktureerimise oskus lihtsalt oskus – see on supervõime. Toorandmed on oma algsel kujul sageli nagu laialivalguv ja detailne pearaamat. See on rikas teabe poolest, kuid raskesti tõlgendatav. Sisuka ülevaate saamiseks peame selle pearaamatu muutma kokkuvõtlikuks kokkuvõtteks. Just siin paistavad pivot-tabelid silma ning Pythoni programmeerijate jaoks pakub Pandase teek võimsat ja paindlikku tööriista: pivot_table().
See juhend on mõeldud andmeanalüütikute, teadlaste ja Pythoni entusiastide globaalsele publikule. Me sukeldume sügavalt Pandase pivot-tabelite mehaanikasse, liikudes põhimõistetest edasijõudnud tehnikateni. Olenemata sellest, kas võtate kokku müüginumbreid erinevatelt kontinentidelt, analüüsite kliimaandmeid erinevates piirkondades või jälgite hajutatud meeskonna projektimõõdikuid, muudab pivot-tabelite valdamine põhjalikult teie lähenemist andmete uurimisele.
Mis täpselt on Pivot-tabel?
Kui olete kunagi kasutanud arvutustabelitarkvara, nagu Microsoft Excel või Google Sheets, olete tõenäoliselt tuttav pivot-tabeli mõistega. See on interaktiivne tabel, mis võimaldab teil suuremast andmekogumist ümber korraldada ja summeerida valitud andmete veerge ja ridu, et saada soovitud aruanne.
Pivot-tabel teeb kahte peamist asja:
- Agregeerimine: see arvutab summeeritud statistika (nagu summa, keskmine või arv) arvandmete kohta, mis on rühmitatud ühe või mitme kategooria järgi.
- Ümberkujundamine: see teisendab andmed „pikast“ vormingust „laiaks“ vorminguks. Selle asemel, et kõik väärtused oleks ühes veerus, „pöörab“ see veeru unikaalsed väärtused väljundis uuteks veergudeks.
Pandase funktsioon pivot_table() toob selle võimsa funktsionaalsuse otse teie Pythoni andmeanalüüsi töövoogu, võimaldades reprodutseeritavat, skriptitavat ja skaleeritavat andmete ümberkujundamist.
Keskkonna ja näidisandmete seadistamine
Enne alustamist veenduge, et Pandase teek on installitud. Kui ei, saate selle installida pipi abil, mis on Pythoni paketi installer:
pip install pandas
Nüüd importime selle oma Pythoni skripti või märkmikusse:
import pandas as pd
import numpy as np
Globaalse müügi andmestiku loomine
Et muuta oma näited praktilisteks ja globaalselt asjakohasteks, loome sünteetilise andmestiku, mis esindab rahvusvahelise e-kaubandusettevõtte müügiandmeid. See andmestik sisaldab teavet müügi kohta erinevatest piirkondadest, riikidest ja tootegruppidest.
# Loo andmesõnastik
data = {
'TransactionID': range(1, 21),
'Date': pd.to_datetime([
'2023-01-15', '2023-01-16', '2023-01-17', '2023-02-10', '2023-02-11',
'2023-02-12', '2023-03-05', '2023-03-06', '2023-03-07', '2023-01-20',
'2023-01-21', '2023-02-15', '2023-02-16', '2023-03-10', '2023-03-11',
'2023-01-18', '2023-02-20', '2023-03-22', '2023-01-25', '2023-02-28'
]),
'Region': [
'North America', 'Europe', 'Asia', 'North America', 'Europe', 'Asia', 'North America', 'Europe', 'Asia', 'Europe',
'Asia', 'North America', 'Europe', 'Asia', 'North America', 'Asia', 'Europe', 'North America', 'Europe', 'Asia'
],
'Country': [
'USA', 'Germany', 'Japan', 'Canada', 'France', 'India', 'USA', 'UK', 'China', 'Germany',
'Japan', 'USA', 'France', 'India', 'Canada', 'China', 'UK', 'USA', 'Germany', 'India'
],
'Product_Category': [
'Electronics', 'Apparel', 'Electronics', 'Books', 'Apparel', 'Electronics', 'Books', 'Electronics', 'Apparel',
'Apparel', 'Books', 'Electronics', 'Books', 'Apparel', 'Electronics', 'Books', 'Apparel', 'Books', 'Electronics', 'Electronics'
],
'Units_Sold': [10, 5, 8, 20, 7, 12, 15, 9, 25, 6, 30, 11, 18, 22, 14, 28, 4, 16, 13, 10],
'Unit_Price': [1200, 50, 900, 15, 60, 1100, 18, 950, 45, 55, 12, 1300, 20, 40, 1250, 14, 65, 16, 1150, 1050]
}
# Loo DataFrame
df = pd.DataFrame(data)
# Arvuta tulu
df['Revenue'] = df['Units_Sold'] * df['Unit_Price']
# Kuva DataFrame'i esimesed read
print(df.head())
See andmestik annab meile kindla aluse, mis sisaldab kategoorilisi andmeid (piirkond, riik, tootegrupp), arvandmeid (müüdud ühikud, tulu) ja ajaseeriaandmeid (kuupäev).
Funktsiooni pivot_table() anatoomia
Pandase funktsioon pivot_table() on uskumatult mitmekülgne. Vaatame selle kõige olulisemaid parameetreid lähemalt:
pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, margins_name='All')
- data: DataFrame, mida soovite pöörata.
- values: veerg (veerud), mis sisaldab agregeeritavaid andmeid. Kui seda ei ole määratud, kasutatakse kõiki ülejäänud arvveerge.
- index: veerg (veerud), mille unikaalsed väärtused moodustavad uue pivot-tabeli read. Seda nimetatakse mõnikord rühmitusvõtmeks.
- columns: veerg (veerud), mille unikaalsed väärtused „pööratakse“ uue tabeli veergude moodustamiseks.
- aggfunc: agregeerimisfunktsioon, mida rakendatakse väärtustele. See võib olla string, nagu 'sum', 'mean', 'count', 'min', 'max', või funktsioon, nagu
np.sum. Saate edastada ka funktsioonide loendi või sõnastiku, et rakendada erinevatele veergudele erinevaid funktsioone. Vaikimisi on 'mean'. - fill_value: väärtus, mis asendab kõik puuduvad tulemused (NaN-id) pivot-tabelis.
- margins: boolean. Kui väärtuseks on
True, lisab see ridade ja veergude alamsummad (tuntud ka kui kogusumma). - margins_name: rea/veeru nimi, mis sisaldab summasid, kui
margins=True. Vaikimisi on 'All'.
Teie esimene Pivot-tabel: lihtne näide
Alustame tavalise ärilise küsimusega: „Mis on iga tootegrupi genereeritud kogutulu?“
Sellele vastamiseks peame:
- Kasutama ridade jaoks
Product_Category(index). - Agregeerima veeru
Revenue(values). - Kasutama summat agregeerimisfunktsioonina (aggfunc).
# Lihtne pivot-tabel, et näha tootegrupi kogutulu
category_revenue = pd.pivot_table(df,
values='Revenue',
index='Product_Category',
aggfunc='sum')
print(category_revenue)
Väljund:
Revenue
Product_Category
Apparel 1645
Books 1184
Electronics 56850
Koheselt on meil selge ja kokkuvõtlik ülevaade. Toores, 20-realine tehingulogi on ümber kujundatud 3-realiseks tabeliks, mis vastab otse meie küsimusele. See on pivot-tabeli põhiline võimsus.
Veeru dimensiooni lisamine
Laiendame seda nüüd. Mis siis, kui me tahame näha kogutulu tootegrupi järgi, aga ka piirkondade kaupa? Siin tuleb mängu parameeter columns.
# Pivot-tabel indeksi ja veergudega
revenue_by_category_region = pd.pivot_table(df,
values='Revenue',
index='Product_Category',
columns='Region',
aggfunc='sum')
print(revenue_by_category_region)
Väljund:
Region Asia Europe North America Product_Category Apparel 1125.0 625.0 NaN Books 336.0 360.0 488.0 Electronics 13200.0 14550.0 29100.0
See väljund on palju rikkalikum. Oleme pööranud veeru „Region“ unikaalsed väärtused („Asia“, „Europe“, „North America“) uuteks veergudeks. Nüüd saame hõlpsasti võrrelda, kuidas erinevad tootegrupid erinevates piirkondades toimivad. Näeme ka väärtust NaN (Not a Number). See näitab, et meie andmestikus ei registreeritud „North America“ jaoks ühtegi „Apparel“ müüki. See on iseenesest väärtuslik teave!
Edasijõudnud pööramise tehnikad
Põhitõed on võimsad, kuid funktsiooni pivot_table() tõeline paindlikkus avaldub selle täiustatud funktsioonides.
Puuduvate väärtuste käsitlemine funktsiooniga fill_value
NaN meie eelmises tabelis on täpne, kuid aruandluse või edasiste arvutuste jaoks võib olla eelistatav kuvada seda nullina. Parameeter fill_value muudab selle lihtsaks.
# Funktsiooni fill_value kasutamine NaN asendamiseks 0-ga
revenue_by_category_region_filled = pd.pivot_table(df,
values='Revenue',
index='Product_Category',
columns='Region',
aggfunc='sum',
fill_value=0)
print(revenue_by_category_region_filled)
Väljund:
Region Asia Europe North America Product_Category Apparel 1125 625 0 Books 336 360 488 Electronics 13200 14550 29100
Tabel on nüüd puhtam ja kergemini loetav, eriti mitte-tehnilisele publikule.
Mitme indeksi kasutamine (hierarhiline indekseerimine)
Mis siis, kui teil on vaja rühmitada rohkem kui ühe kategooria järgi ridades? Näiteks jaotame müügi piirkonna Region järgi ja seejärel iga piirkonna sees riigi Country järgi. Saame edastada veergude loendi parameetrile index.
# Mitmetasandiline pivot-tabel, kasutades indeksi jaoks loendit
multi_index_pivot = pd.pivot_table(df,
values='Revenue',
index=['Region', 'Country'],
aggfunc='sum',
fill_value=0)
print(multi_index_pivot)
Väljund:
Revenue
Region Country
Asia China 488
India 1760
Japan 10860
Europe France 1020
Germany 14440
UK 1115
North America Canada 17800
USA 12058
Pandas on automaatselt loonud ridadele MultiIndex. See hierarhiline struktuur on fantastiline andmetesse süvenemiseks ja pesastatud seoste nägemiseks. Saate rakendada sama loogikat parameetrile columns, et luua hierarhilisi veerge.
Mitme agregeerimisfunktsiooni kasutamine
Mõnikord ei piisa ühest summeeritud statistikast. Võib-olla soovite näha iga rühma kogutulu (summa) ja keskmist tehingu suurust (keskmine). Saate edastada funktsioonide loendi funktsioonile aggfunc.
# Mitme agregeerimisfunktsiooni kasutamine
multi_agg_pivot = pd.pivot_table(df,
values='Revenue',
index='Region',
aggfunc=['sum', 'mean', 'count'])
print(multi_agg_pivot)
Väljund:
sum mean count
Revenue Revenue Revenue
Region
Asia 13108.000000 2184.666667 6
Europe 16575.000000 2762.500000 6
North America 29858.000000 4976.333333 6
See üks käsk annab meile põhjaliku kokkuvõtte: kogutulu, keskmine tulu tehingu kohta ja tehingute arv iga piirkonna kohta. Pange tähele, kuidas Pandas loob hierarhilisi veerge, et hoida väljundit korrastatuna.
Erinevate funktsioonide rakendamine erinevatele väärtustele
Saate olla veelgi detailsem. Kujutage ette, et soovite näha Revenue summat, kuid Units_Sold keskmist. Saate edastada funktsioonile aggfunc sõnastiku, kus võtmed on veerunimed („values“) ja väärtused on soovitud agregeerimisfunktsioonid.
# Erinevad agregeerimised erinevatele väärtustele
dict_agg_pivot = pd.pivot_table(df,
index='Region',
values=['Revenue', 'Units_Sold'],
aggfunc={
'Revenue': 'sum',
'Units_Sold': 'mean'
},
fill_value=0)
print(dict_agg_pivot)
Väljund:
Revenue Units_Sold
Region
Asia 13108 17.833333
Europe 16575 8.166667
North America 29858 14.333333
See kontrollitase on see, mis muudab pivot_table() peamiseks tööriistaks keerukaks andmeanalüüsiks.
Kogusummade arvutamine funktsiooniga margins
Aruandluse eesmärgil on sageli oluline, et oleks olemas rea- ja veerusummad. Argument margins=True tagab selle ilma täiendava pingutuseta.
# Summade lisamine funktsiooniga margins=True
revenue_with_margins = pd.pivot_table(df,
values='Revenue',
index='Product_Category',
columns='Region',
aggfunc='sum',
fill_value=0,
margins=True,
margins_name='Grand Total') # Kohandatud nimi summade jaoks
print(revenue_with_margins)
Väljund:
Region Asia Europe North America Grand Total Product_Category Apparel 1125 625 0 1750 Books 336 360 488 1184 Electronics 13200 14550 29100 56850 Grand Total 14661 15535 29588 59784
Pandas arvutab automaatselt iga rea summa (kogutulu tootegrupi kohta kõigis piirkondades) ja iga veeru summa (kogutulu piirkonna kohta kõigis kategooriates), pluss kogusumma kõigi andmete jaoks paremas allnurgas.
Praktiline kasutusjuhtum: ajapõhine analüüs
Pivot-tabelid ei piirdu staatiliste kategooriatega. Need on uskumatult kasulikud ajaseeriaandmete analüüsimiseks. Leiame iga kuu kogutulu.
Esmalt peame veeru „Date“ kuupäeva eraldama. Selleks saame kasutada Pandases funktsiooni .dt.
# Kuupäeva veeru kuu eraldamine
df['Month'] = df['Date'].dt.month_name()
# Pivot, et näha igakuist tulu tootegrupi järgi
monthly_revenue = pd.pivot_table(df,
values='Revenue',
index='Month',
columns='Product_Category',
aggfunc='sum',
fill_value=0)
# Valikuline: kuude korrektne järjestamine
month_order = ['January', 'February', 'March']
monthly_revenue = monthly_revenue.reindex(month_order)
print(monthly_revenue)
Väljund:
Product_Category Apparel Books Electronics Month January 250 360 23100 February 795 794 24250 March 705 30 9500
See tabel annab meile selge ülevaate iga kategooria müügitulemustest aja jooksul, võimaldades meil hõlpsalt märgata suundumusi, hooajalisust või kõrvalekaldeid.
pivot_table() vs. groupby(): mis on erinevus?
See on tavaline küsimus neile, kes Pandast õpivad. Need kaks funktsiooni on omavahel tihedalt seotud ja tegelikult on pivot_table() ehitatud groupby() peale.
groupby()on üldisem ja põhilisem toiming. See rühmitab andmed mõne kriteeriumi alusel ja võimaldab seejärel rakendada agregeerimisfunktsiooni. Tulemuseks on tavaliselt Pandase seeria või DataFrame hierarhilise indeksiga, kuid see jääb „pikaks“ vorminguks.pivot_table()on spetsiaalne tööriist, mis teeb rühmitamise ja seejärel kujundab andmed ümber. Selle peamine eesmärk on teisendada andmed pikast vormingust laiaks vorminguks, mis on sageli inimesele paremini loetav.
Vaatame uuesti meie esimest näidet kasutades groupby():
# Sama tulemus kui meie esimene pivot-tabel, kuid kasutades groupby
category_revenue_groupby = df.groupby('Product_Category')['Revenue'].sum()
print(category_revenue_groupby)
Tulemus on Pandase seeria, mis on funktsionaalselt samaväärne meie esimese pivot-tabeli DataFrame’iga. Kui aga lisate teise rühmitusvõtme (nt „Region“), muutub erinevus selgeks.
# Rühmitamine kahe veeru järgi
groupby_multi = df.groupby(['Product_Category', 'Region'])['Revenue'].sum()
print(groupby_multi)
Väljund (seeria MultiIndexiga):
Product_Category Region
Apparel Asia 1125
Europe 625
Books Asia 336
Europe 360
North America 488
Electronics Asia 13200
Europe 14550
North America 29100
Name: Revenue, dtype: int64
Sama „lai“ vormingu saamiseks nagu pivot_table(index='Product_Category', columns='Region'), peaksite kasutama groupby(), millele järgneb unstack():
# Pivot-tabeli kopeerimine groupby().unstack() abil
groupby_unstack = df.groupby(['Product_Category', 'Region'])['Revenue'].sum().unstack(fill_value=0)
print(groupby_unstack)
See toodab täpselt sama väljundi kui meie veergudega pivot-tabel. Seega võite pivot_table() pidada mugavaks otsetee tavalisele töövoole groupby().aggregate().unstack().
Millal mida kasutada?
- Kasutage
pivot_table(), kui soovite inimesele loetavat, laia vorminguga väljundit, eriti aruandluse või risttabelite loomise jaoks. - Kasutage
groupby(), kui vajate rohkem paindlikkust, teete andmetöötluskonveieris vahearvutusi või kui ümberkujundatud lai vorming ei ole teie lõppeesmärk.
Jõudlus ja parimad tavad
Kuigi pivot_table() on võimas, on oluline seda tõhusalt kasutada, eriti suurte andmestike puhul.
- Filtreeri esmalt, pöörda hiljem: Kui teil on vaja analüüsida ainult andmete alamhulka (nt eelmise aasta müüki), filtreerige DataFrame enne pivot-tabeli rakendamist. See vähendab andmete hulka, mida funktsioon peab töötlema.
- Kasutage kategoorilisi tüüpe: veergude puhul, mida kasutate sageli pivot-tabelite indeksite või veergudena (nt „Region“ või „Product_Category“), teisendage need Pandases tüübiks „category“. See võib oluliselt vähendada mälukasutust ja kiirendada rühmitamistoiminguid.
df['Region'] = df['Region'].astype('category') - Hoidke see loetavana: vältige liiga paljude indeksite ja veergudega pivot-tabelite loomist. Kuigi see on võimalik, võib pivot-tabel, mis on sadu veerge lai ja tuhandeid ridu pikk, muutuda sama raskesti loetavaks kui algsed toorandmed. Kasutage seda sihipäraste kokkuvõtete loomiseks.
- Saage aru agregeerimisest: pidage meeles oma valikut
aggfunc. Hindadele summasumkasutamine ei ole mõttekas, samas kui keskminemeanvõib olla sobivam. Veenduge alati, et teie agregeerimine on kooskõlas küsimusega, millele proovite vastata.
Järeldus: teie tööriist sisukate kokkuvõtete jaoks
Pandase funktsioon pivot_table() on iga andmeanalüütiku tööriistakomplektis asendamatu tööriist. See pakub deklaratiivset, väljendusrikast ja võimsat viisi, kuidas liikuda segastest ja detailsetest andmetest puhaste ja sisukate kokkuvõteteni. Mõistes ja omandades selle põhikomponendid – values, index, columns ja aggfunc – ning kasutades selle täiustatud funktsioone, nagu mitmetasandiline indekseerimine, kohandatud agregeerimised ja marginaalid, saate andmeid ümber kujundada, et vastata keerukatele äriküsimustele vaid mõne Pythoni koodireaga.
Järgmine kord, kui seisate silmitsi suure andmestikuga, vältige soovi lõputult ridades kerida. Selle asemel mõelge küsimustele, millele peate vastama, ja sellele, kuidas pivot-tabel saab teie andmeid ümber kujundada, et paljastada peidetud lood. Head pööramist!